\chapter{Tracker}
\section{Fonctionnement de base}
Le tracker est l'entité centrale permettant la coordination de tous les pairs. En effet, grâce aux messages échangés avec les pairs, le tracker connaît tous les fichiers et les pairs connectés à un moment donné. Il peut ainsi assister les pairs lors de leur recherche d'un certains fichier.

Au démarrage, chaque pair doit envoyer un message au tracker lui précisant les fichiers qu'ils possèdent. Au fur et à mesure le tracker doit mettre à jour ses données en fonction de celles que lui envoient les autres pairs.

\section{Architecture}
Pour implémenter le tracker nous avons utilisés plusieurs classes:
\begin{itemize}
\item $Serveur$ met en place la connexion entre les différents pairs.\\
\item $Client1$ permet de parser et d'effectuer les différents messages reçus tel que:
\begin{verbatim}
announce listen $port seed [$file $filesize $piecesize $key] leech[...]
\end{verbatim}
Une fonction $announce$ permet alors de lire le message, de stocker le pair et tous ses fichiers dans une base de données.\\
\item $Peer$ représente un pair ayant la liste des clés des fichiers qu'il possède. Pour pouvoir différencier les fichiers ``seedés'' et ``leechés'', deux listes ont été implémentées: $seeds$ et $leeches$.  Pour pouvoir identifier un pair, le tracker a besoin de son adresse ip et de son port d'écoute avec le tracker. Lors d'un $announce$, le pair indique, de pus, un autre port d'écoute, celui que les pairs utiliseront pour les téléchargements. Ce dernier aurait pu être stocké dans un fichier de configuration mais a finalement été implémenté dans la structure de $Peer$.\\
\item $File$ représente un fichier ayant la liste des clés des pairs le possédant. Il a pour attribut les propriétés habituelles d'un fichier: son nom, sa taille et la taille de ses pièces.\\
\item $FileSet$ et $PeerSet$ stockent respectivement les fichiers et les pairs dans une table de hachage. Chaque élément peut donc être idéntifié par une clé unique, en encodage MD5 pour les fichiers et en concaténant l'adresse ip et le port d'écoute pour les pairs.
\end{itemize}
  
\section{Connexion}

\section{Stockage et mise à jour}
Pour la base de données, nous avons préférés manipulés des tables de hachage. Pour cela, nous avons utilisé la classe $Hashmap$.
Au démarage, un pair doit annoncer sa présence au tracker. Une fois l'announce reçu, le tracker lit le message. Il crée alors une nouvelle entité $Peer$ et ajoute les clés des fichiers présents dans le $announce$ dans la liste correspondante (seeds ou leeches) puis ajoute le pair dans la table de hachage de $PeerSet$.
Ensuite, il recherche dans la table de $FileSet$ tous les fichiers indiqués dans le $announce$. Si un des fichiers existe déjà, il ajoute la clé du pair dans la liste, sinon, il effectue les opérations précédemment effectuées pour le pair.

Le pair indique périodiquement le Tracker des différents fichiers disponibles ou en cours de téléchargement par :
\begin{verbatim}
update seed[\$key ...] leech[]
\end{verbatim}
Le tracker récupère alors le pair dans la table de hachage, met à jour les listes seeds et leeches, puis fait de même avec les fichiers.




